Tips&Tricks I trucchi del mestiere

 

Come sfumare lo sfondo

Con il codice qui presentato avremo a disposizione un metodo semplice ed efficace per ottenere il classico effetto di sfumatura dello sfondo tipico, ad esempio, di molte applicazioni di installazione. La sfumatura andrα a schiarirsi dal basso verso l'alto, mentre la scelta del colore base si effettua attraverso la combinazione dei tra parametri booleani accettati dalla funzione (rosso, verde e blu). Ad esempio, per avere la sfumatura blu come sfondo Φ sufficiente scrivere il seguente codice nella procedura Form_Load:

#include
FadeForm Me, False, False, True

Ecco il codice della funzione:

Sub FadeForm (frm As Form, Red%, _
         Green%, Blue%)
         Dim SaveScale%, SaveStyle%, _
                SaveRedraw%
         Dim i&, j&, x&, y&, pixels%

         ' Save current settings.
         SaveScale = frm.ScaleMode
         SaveStyle = frm.DrawStyle
        SaveRedraw = frm.AutoRedraw

         ' Paint screen.
         frm.ScaleMode = 3
         pixels = Screen.Height / _
                Screen.TwipsPerPixelY
         x = pixels / 64# + .5
         frm.DrawStyle = 5
         frm.AutoRedraw = True
         For j = 0 To pixels Step x
                y = 240 - 245 * j \ pixels
                'can tweak this to preference.
                If y < 0 Then y = 0
                'just in case.
                frm.Line (-2, j - 2)- _
                        (Screen.Width + 2, j + _
                        x + 3), RGB(-Red * y, -Green _
                                * y, -Blue * y), BF
         Next j

         ' Reset to previous settings.
         frm.ScaleMode = SaveScale
         frm.DrawStyle = SaveStyle
         frm.AutoRedraw = SaveRedraw
End Sub

Come mostrare i font durante la selezione

La prima cosa da fare Φ popolare la ComboBox con i nomi dei font disponibili nel sistema, per fare ci≥ Φ sufficiente aggiungere il seguente codice a Form_Load()


For I = 0 To Screen.FontCount - 1
    ' Put each font into list box.
    cboFont.AddItem Screen.Fonts(I) 
Next I

Non resta che gestire l'evento Click aggiungendo il codice che imposta il font del ComboBox:


Private Sub cboFont_Click()
        'Set the FontName of the combo box 
        'to the font that was selected.
        cboFont.FontName = cboFont.Text   
End Sub

Come salvare la dimensione e la posizione di una Form

Molti di voi avranno notato che, all'avvio, alcune applicazioni "ricordano" la posizione e la dimensione in cui si trovavano al momento dell'ultimo utilizzo. In questo tip spieghiamo come realizzare lo stesso effetto in un'applicazione Visual Basic. In un modulo dell'applicazione specifichiamo una costante di questo tipo:

Public Const ApplicationName = "Nome Applicazione"

Questo nome serve a distinguere l'applicazione nel registro di Windows. Nell'evento Form_Load richiamiamo la funzione di recupero delle impostazione, passando come argomento il riferimento alla form corrente:

Call LoadFormDisplaySettings(Me)

Mentre nell'evento Form_Unload richiamiamo la funzione di salvataggio delle impostazioni:

Call SaveFormDisplaySettings(Me)

Da notare che come effetto indesiderato di questo metodo si ha che nel registro di Windows restano le impostazioni che abbiamo definito anche dopo che l'applicazione viene disinstallata. Se si vuole intervenire su questo aspetto, le informazioni si trovano in:

HKEY_CURRENT_USER\Software\VB and VBA Program Settings\My Application Name\.

Nel CD trovate il codice delle due funzioni di salvataggio e ripristino delle impostazioni, codice che va inserito in un modulo dell'applicazione.

Public Sub SaveFormDisplaySettings(frm As Form)
	If frm.Tag = "" Then Exit Sub
	SaveSetting ApplicationName, frm.Tag & _
		" Display Settings", "Top", Str(frm.Top)
	SaveSetting ApplicationName, frm.Tag & _
		" Display Settings", "Left", Str(frm.Left)
	SaveSetting ApplicationName, frm.Tag & _
		" Display Settings", "Height", Str(frm.Height)
	SaveSetting ApplicationName, frm.Tag & _
		" Display Settings", "Width", Str(frm.Width)
End Sub

Public Sub LoadFormDisplaySettings(frm As Form)
	Dim FormSettings As Variant
	Dim intSettings As Integer
	If frm.Tag = "" Then Exit Sub
	FormSettings = GetAllSettings(ApplicationName, frm.Tag & _
		" Display Settings")
	If IsEmpty(FormSettings) Then Exit Sub
	For intSettings = LBound(FormSettings, 1) _
		To UBound(FormSettings, 1)
	Select Case FormSettings(intSettings, 0)
		Case "Left"
			frm.Left = Val(FormSettings(intSettings, 1))
		Case "Top"
			frm.Top = Val(FormSettings(intSettings, 1))
		Case "Height"
			frm.Height = Val(FormSettings(intSettings, 1))
		Case "Width"
			frm.Width = Val(FormSettings(intSettings, 1))
	End Select
	Next intSettings
End Sub

	  

Come controllare l'input

Capita spesso di utilizzare dei textbox per effettuare l'input di dati di tipo numerico. Per accertarsi che l'utente non digiti caratteri alfabetici Φ possibile effettuare un controllo a posteriori rispetto all'immissione anche se sarebbe preferibile impedire direttamente in fase di digitazione l'immissione di caratteri diversi da quelli numerici: proprio quello che consente il codice qui presentato.

Option Explicit
Private strClipboardText As String

Private Sub txtNumberBox_KeyPress(KeyAscii As Integer)
    If (KeyAscii <= Asc("0") Or KeyAscii >= Asc("9")) And KeyAscii <> vbKeyBack Then
        KeyAscii = 0
    End If
End Sub

Private Sub txtNumberBox_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    ' User can paste char values by pasting contents of clipboard, which should be prevented.
    strClipboardText = Clipboard.GetText
    If Not IsNumeric(strClipboardText) Then Clipboard.Clear
End Sub

Private Sub txtNumberBox_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    ' If there was any char value in clipboard and was cleared, restore that Value
    If Not IsNumeric(strClipboardText) Then Clipboard.SetText strClipboardText
End Sub
	  

Come ordinare un array

La funzione che presentiamo accetta un array monodimensionale come parametro e, attraverso l'implementazione un semplice bubble sort, si occupa di ordinarlo. L'a sistemazione degli elementi pu≥ avvenire sia in ordine crescente che decrescente, a seconda del valore booleano che la funzone accetta come secondo parametro. Nel codice allegato Φ presente anche un piccolo esempio esplicativo.

Private Sub BubbleSort(varArray As Variant, bAscending As Boolean)
    'Option Base 0 is assumed    
    Dim HoldEntry As Integer
    Dim SwapOccurred As Boolean
    Dim iItteration As Integer
    Dim i As Integer
 
    SwapOccurred = True
    iItteration = 1
    
    Do Until Not SwapOccurred
        SwapOccurred = False
        For i = LBound(varArray) To UBound(varArray) - iItteration Step 1
            If bAscending Then
                If varArray(i) > varArray(i + 1) Then
                    HoldEntry = varArray(i)
                    varArray(i) = varArray(i + 1)
                    varArray(i + 1) = HoldEntry
                    SwapOccurred = True
                End If
            Else
                If varArray(i + 1) > varArray(i) Then
                    HoldEntry = varArray(i)
                    varArray(i) = varArray(i + 1)
                    varArray(i + 1) = HoldEntry
                    SwapOccurred = True
                End If
            End If
        Next i
        iItteration = iItteration + 1   'reduce iteration each time as greatest/lowest
                                        'item already at end/start of array
    Loop
    
End Sub
 
'to call ....
Private Sub cmdBubbleSort_Click()
 
    Dim lArray(999) As Long, iCnt As Integer
    
    'populate array with dummy data
    For iCnt = LBound(lArray) To UBound(lArray) Step 1
        lArray(iCnt) = Int((1000 * Rnd) + 1)
    Next iCnt
 
    Call BubbleSort(lArray, True)
    
    'display result
    For iCnt = LBound(lArray) To UBound(lArray) Step 1
        lstResult.AddItem lArray(iCnt)
    Next iCnt
 
End Sub

	  

Come chiudere tutte le Form

Il codice peresentato va sistemato nell'evento Query_Unload e si occupa di chiudere tutte le form presenti in memoria. Oltre alla chiusura di ogni form, viene anche lanciato un evento di unload per consentire una migliore pulizia della memoria.

Dim f As Form
For Each f In Forms
    If f.hwnd <> Me.hwnd Then
        Unload f
    End If
Next
	  

Come cancellare un elemento in un array

In molti problemi, l'eliminazione di un elemento in un array dovrebbe essere seguita dal ricompattamento degli elementi successi a quello eliminato per evitare un "buco" nell'insieme. L'algoritmo che presentiamo si occupa proprio di eliminare e ricompattare l'array rapidamente.

Dim f As Form
' Element to delete
iDelete = 5
' Number of elements before deletion
nElements = UBound(Array)
' Replace iDelete with last item in array
Array(iDelete) = Array(nElements)
' Use ReDim Preserve to shrink array by one
ReDim Preserve Array(LBound(Array) To nElements - 1)
	  

Come verificare l'esistenza di un file

Un piccolo esempio che si rivela utile in una vasta casistica di applicazioni: il codice non fa altro che mostrare il corretto utilizzo di Dir$ per la verifica dell'esistenza di un file in un determinato percorso.

         If Dir$("C:\WINDOWS\WIN.INI")  <> "" Then
                'file Win.ini exists!
         Else
                'file Win.ini does not exist!
         End If